var express = require('express');
var router = express.Router();

const md5 = require('blueimp-md5')

// const models = require('../db/models')
// const UserModel = models.UserModel
// const ChatModel = models.ChatMode
const { UserModel, ChatModel } = require('../db/models')

const filter = { password: 0 } // 查询时过滤出指定的属性

/* GET home page. */
// router.get('/', function(req, res, next) {
//   res.render('index', { title: 'Express' });
// });

router.post('/register', function (req, res, next) {
  const { username, password, type } = req.body
  console.log(req.body);
  console.log('register', username, password)
  // 根据 username 查询数据库, 看是否已存在 user
  UserModel.findOne({ username }, function (err, user) {
    if (user) {
      res.send({ code: 1, msg: '此用户已存在' })
    } else {
      // 如果不存在, 将提交的 user 保存到数据库
      new UserModel({ username, password: md5(password), type }).save(function (err, user) {
        // 生成一个 cookie(userid: user._id), 并交给浏览器保存
        res.cookie('userid', user._id, { maxAge: 1000 * 60 * 60 * 24 * 7 }) // 持久化cookie, 浏览器会保存在本地文件
        res.send({ code: 0, data: { _id: user._id, username, type, toUrl: "login" } })
        // res.send({ code: 0, data: { _id: user._id, username, type }})
      })
    }
  })
})

router.post('/login', function (req, res) {
  const { username, password } = req.body
  console.log('register', username, password)
  // 根据 username 和 password 去数据库查询得到 user
  UserModel.findOne({ username, password: md5(password) }, filter, function (err, user) {
    if (user) {
      // 生成一个 cookie(userid: user._id), 并交给浏览器保存
      res.cookie('userid', user._id, { maxAge: 1000 * 60 * 60 * 24 * 7 })
      // res.send({ code: 0, data: user, toUrl: 'main' })
      res.send({ code: 0, data: user })
    } else {
      res.send({ code: 1, mes: "用户名或密码错误" })
    }
  })
})

// 更新用户路由
router.post('/update', function (req, res) {
  // 得到请求 cookie 的 userid
  const userid = req.cookies.userid
  console.log(userid);
  console.log(req.body);

  if (!userid) {// 如果没有, 说明没有登陆, 直接返回提示
    return res.send({ code: 1, msg: '请先登陆' })
  };
  // 更新数据库中对应的数据
  UserModel.findByIdAndUpdate({ _id: userid }, req.body, function (err, user) {// user是数据库中原来的数据
    console.log(user);
    const { _id, username, type } = user
    // node 端 ...不可用
    // const data = {...req.body, _id, username, type}
    // 合并用户信息
    const data = Object.assign(req.body, { _id, username, type })
    // assign(obj1, obj2, obj3,...) // 将多个指定的对象进行合并, 返回一个合并后的对象res.send({code: 0, data})
    res.send({ code: 0, data })
  })
})

router.get('/user', function (req, res) {
  const userid = req.cookies.userid
  console.log(req.cookies.userid);
  if (!userid) {
    return res.send({ code: 1, msg: "请先登录！！" })
  }
  UserModel.findOne({ _id: userid }, filter, function (err, user) {
    return res.send({ code: 0, data: user })
  })
})

router.get('/list', function (req, res) {
  const { type } = req.query
  UserModel.find({ type }, function (err, users) {
    return res.json({ code: 0, data: users })
  })
})

/*获取当前用户所有相关聊天信息列表
*/
router.get('/msglist', function (req, res) {
  // 获取 cookie 中的 userid
  const userid = req.cookies.userid
  // 查询得到所有 user 文档数组
  UserModel.find(function (err, userDocs) {
    // 用对象存储所有 user 信息: key 为 user 的_id, val 为 name 和 header 组成的user 对象
    console.log(userDocs);
    // 方式一
    // const users = {} // 对象容器
    // userDocs.forEach(doc => {
    //   users[doc._id] = { username: doc.username, header: doc.header }
    // })

    // 方式二
    const users = userDocs.reduce((users, doc) => {
      users[doc._id] = { username: doc.username, header: doc.header }
      return users
    }, {})

    /*查询 userid 相关的所有聊天信息
    参数 1: 查询条件
    参数 2: 过滤条件
    参数 3: 回调函数
    */
    ChatModel.find({ '$or': [{ from: userid }, { to: userid }] }, filter, function (err,
      chatMsgs) {
      // 返回包含所有用户和当前用户相关的所有聊天消息的数据
      console.log("聊天",chatMsgs);
      res.send({ code: 0, data: { users, chatMsgs } })
    })
  })
})

/*修改指定消息为已读
*/
router.post('/readmsg', function (req, res) {
  // 得到请求中的 from 和 to
  const from = req.body.from
  const to = req.cookies.userid
  /*更新数据库中的 chat 数据
    参数 1: 查询条件
    参数 2: 更新为指定的数据对象
    参数 3: 是否 1 次更新多条, 默认只更新一条
    参数 4: 更新完成的回调函数
    */
  ChatModel.update({ from, to, read: false }, { read: true }, { multi: true }, function (err, doc) {
    console.log('/readmsg', doc)
    res.send({ code: 0, data: doc.nModified }) // 更新的数量
  })
})

module.exports = router;
